﻿using FlyingCircusWebIS.Controllers.Utilidades;
using FlyingCircusWebIS.Models;
using FlyingCircusWebIS.ViewModels.FormaPagamentoVM;
using System;
using System.Collections.Generic;
using System.Data.OleDb;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace FlyingCircusWebIS.Controllers
{
    public class FormaPagamentoController : Controller
    {
        // Identificador das actions disponíveis no controller
        public const string INDEX_ACTION = "Index";
        public const string FORM_ACTION = "Form";
        public const string DESATIVAR_ACTION = "Desativar";
        public const string ATIVAR_ACTION = "Ativar";


        public ActionResult Index()
        {
            FormaPagamentoIndexVM vm = ConstruirIndexVM();
            return View(vm);
        }

        public ActionResult Form(int? id)
        {
            FormaPagamentoFormVM vm;
            if (id.HasValue)
            {
                vm = ConstruirFormVMParaEdicao(id.Value);
                if (vm == null)
                    return new HttpNotFoundResult();
            }
            else
            {
                vm = ConstruirFormVMParaNovo();
            }

            return View(vm);
        }

        [HttpPost]
        public ActionResult Form(FormaPagamentoFormVM vm)
        {
            FormaPagamento registro = ConverterFormVM(vm);

            if (ModelState.IsValid)
            {
                if (vm.Edicao)
                    AtualizarRegistro(registro);
                else
                    InserirRegistro(registro);

                return RedirectToAction(INDEX_ACTION);
            }
            else
            {
                return View(vm);
            }
        }

       
        public JsonResult Desativar(int id)
        {
            DesativarRegistroPorId(id);
            return Json(new JsonActionResultModel("Registro desativado com sucesso."));
        }


        public JsonResult Ativar(int id)
        {
            AtivarRegistroPorId(id);
            return Json(new JsonActionResultModel("Registro ativado com sucesso."));
        }


        // -----------------------------------------------------------------------------------------
        // Métodos auxiliares 
        // -----------------------------------------------------------------------------------------


        private FormaPagamentoFormVM ConstruirFormVMParaNovo()
        {
            return new FormaPagamentoFormVM() { Edicao = false };
        }

        private FormaPagamentoFormVM ConstruirFormVMParaEdicao(int id)
        {
            FormaPagamento registro = BuscarRegistroPorId(id);
            if (registro != null)
            {
                FormaPagamentoFormVM vm = ConverterFormVM(registro);
                vm.Edicao = true;
                return vm;
            }

            return null;
        }


        private FormaPagamento ConverterFormVM(FormaPagamentoFormVM vm)
        {
            FormaPagamento registro = new FormaPagamento();
            registro.IdPagamento = vm.IdPagamento;
            registro.Descricao = vm.Descricao;
            registro.FlagAtivo = (vm.FlagAtivo ? "S" : "N");

            return registro;
        }


        private FormaPagamentoFormVM ConverterFormVM(FormaPagamento registro)
        {
            FormaPagamentoFormVM vm = new FormaPagamentoFormVM();
            vm.IdPagamento = registro.IdPagamento;
            vm.Descricao = registro.Descricao;
            vm.FlagAtivo = registro.FlagAtivo.Equals("S");

            return vm;
        }

        private FormaPagamentoIndexVM ConstruirIndexVM()
        {
            List<FormaPagamento> registros = ListarRegistros();

            FormaPagamentoIndexVM vm = new FormaPagamentoIndexVM();
            vm.Registros = registros;
            vm.TotalRegistros = registros.Count;
            return vm;
        }




        // ----------------------------------------------------------------------------------
        // Métodos auxiliares de acesso ao banco de dados.
        //
        // Os métodos abaixo se comunicam diretamente com o banco de dados.
        // ----------------------------------------------------------------------------------

        private void InserirRegistro(FormaPagamento registro)
        {
            string sqlInserir = "insert into FORMAPAGAMENTO (IdPagamento, Descricao, FlagAtivo) values (seqFormaPagamento.NEXTVAL, ?, ?)";
            GerenciadorConexao gerenciadorConexao = new GerenciadorConexao();

            // Abre a conexão
            gerenciadorConexao.Abrir();

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = gerenciadorConexao.Conexao;
            comando.CommandText = sqlInserir;

            OleDbParameter pDescricao = new OleDbParameter("Descricao", OleDbType.VarChar);
            pDescricao.Value = registro.Descricao;
            comando.Parameters.Add(pDescricao);

            OleDbParameter pFlagAtivo = new OleDbParameter("FlagAtivo", OleDbType.VarChar);
            pFlagAtivo.Value = registro.FlagAtivo;
            comando.Parameters.Add(pFlagAtivo);

            // Insert
            comando.ExecuteNonQuery();

            // Fecha a conexão
            gerenciadorConexao.Fechar();
        }

        private void AtualizarRegistro(FormaPagamento registro)
        {
            string sqlAtualizar = "update FORMAPAGAMENTO set Descricao = ?, FlagAtivo = ? where IdPagamento = ?";
            GerenciadorConexao gerenciadorConexao = new GerenciadorConexao();

            // Abre a conexão
            gerenciadorConexao.Abrir();

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = gerenciadorConexao.Conexao;
            comando.CommandText = sqlAtualizar;

            OleDbParameter pDescricao = new OleDbParameter("Descricao", OleDbType.VarChar);
            pDescricao.Value = registro.Descricao;
            comando.Parameters.Add(pDescricao);

            OleDbParameter pFlagAtivo = new OleDbParameter("FlagAtivo", OleDbType.VarChar);
            pFlagAtivo.Value = registro.FlagAtivo;
            comando.Parameters.Add(pFlagAtivo);

            OleDbParameter pId = new OleDbParameter("IdPagamento", OleDbType.Integer);
            pId.Value = registro.IdPagamento;
            comando.Parameters.Add(pId);

            // Update
            comando.ExecuteNonQuery();

            // Fecha a conexão
            gerenciadorConexao.Fechar();
        }



        private void DesativarRegistroPorId(int id)
        {
            string sqlAtualizar = "update FORMAPAGAMENTO set flagAtivo = 'N' where IdPagamento = " + id;
            GerenciadorConexao gerenciadorConexao = new GerenciadorConexao();

            // Abre a conexão
            gerenciadorConexao.Abrir();

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = gerenciadorConexao.Conexao;
            comando.CommandText = sqlAtualizar;

            // Update
            comando.ExecuteNonQuery();

            // Fecha a conexão
            gerenciadorConexao.Fechar();
        }

        private void AtivarRegistroPorId(int id)
        {
            string sqlAtualizar = "update FORMAPAGAMENTO set flagAtivo = 'S' where IdPagamento = " + id;
            GerenciadorConexao gerenciadorConexao = new GerenciadorConexao();

            // Abre a conexão
            gerenciadorConexao.Abrir();

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = gerenciadorConexao.Conexao;
            comando.CommandText = sqlAtualizar;

            // Update
            comando.ExecuteNonQuery();

            // Fecha a conexão
            gerenciadorConexao.Fechar();
        }

        private List<FormaPagamento> ListarRegistros()
        {
            GerenciadorConexao gerenciadorConexao = new GerenciadorConexao();
            String sqlConsulta = "select * from FORMAPAGAMENTO";

            // Abre a conexão
            gerenciadorConexao.Abrir();

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = gerenciadorConexao.Conexao;
            comando.CommandText = sqlConsulta;

            // Select
            OleDbDataReader dr = comando.ExecuteReader();

            List<FormaPagamento> registros = new List<FormaPagamento>();
            while (dr.Read())
            {
                FormaPagamento registro = ConverterDataReaderParaObj(dr);
                registros.Add(registro);
            }

            // Fecha a conexão
            gerenciadorConexao.Fechar();

            return registros;
        }


        private FormaPagamento BuscarRegistroPorId(int id)
        {
            FormaPagamento registro = null;
            string sqlBuscar = "select * from FORMAPAGAMENTO where IdPagamento = " + id;
            GerenciadorConexao gerenciadorConexao = new GerenciadorConexao();

            // Abre a conexão
            gerenciadorConexao.Abrir();

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = gerenciadorConexao.Conexao;
            comando.CommandText = sqlBuscar;

            // Select
            OleDbDataReader dr = comando.ExecuteReader();
            if (dr.Read())
            {
                registro = ConverterDataReaderParaObj(dr);
            }

            // Fecha a conexão
            gerenciadorConexao.Fechar();

            return registro;
        }


        private FormaPagamento ConverterDataReaderParaObj(OleDbDataReader dr)
        {
            FormaPagamento registro = new FormaPagamento();
            registro.IdPagamento = Int32.Parse(dr["IdPagamento"].ToString());
            registro.Descricao = dr["Descricao"].ToString();
            registro.FlagAtivo = dr["FlagAtivo"].ToString();

            return registro;
        }

    }
}
